using System;
using System.Collections.Generic;
using System.Text;
using EntidadesTO;
using System.Data;
using System.Data.SqlClient;

namespace AccesoDatos
{
    public class SolicitudDeFraccionamientoDA
    {
        public int GuardarNuevo(SolicitudDeFraccionamientoTO pSolicitud)
        {
            SqlParameter ParametroNumeroSolicitud;
            SqlCommand comando;
            ConexionBD instanciaConexion = ConexionBD.ObtenerInstancia();

            ParametroNumeroSolicitud = new SqlParameter("@pNumeroSolicitud", SqlDbType.Int);
            ParametroNumeroSolicitud.Direction = ParameterDirection.Output;

            try
            {
                instanciaConexion.AbrirConexion();
                comando = new SqlCommand("sp_ins_SEC_SolicitudDeFraccionamiento", instanciaConexion.ObtenerConexion());
                comando.Parameters.AddWithValue("@pFechaSolicitud", pSolicitud.FechaSolicitud);
                comando.Parameters.AddWithValue("@pNumeroCuotas", pSolicitud.NumeroCuotas);
                comando.Parameters.AddWithValue("@pTasaFraccionamiento", pSolicitud.TasaFraccionamiento);
                comando.Parameters.AddWithValue("@pMontoFraccionamiento", pSolicitud.MontoFraccionamiento);
                comando.Parameters.AddWithValue("@pCodEstadoSolicitud", pSolicitud.CodEstadoSolicitud);
                comando.Parameters.AddWithValue("@pCodPersona", pSolicitud.CodPersona);

                comando.Parameters.Add(ParametroNumeroSolicitud);

                comando.CommandType = CommandType.StoredProcedure;

                comando.ExecuteNonQuery();

                instanciaConexion.CerrarConexion();
            }
            catch (SqlException ex)
            {
                throw ex;
            }
            finally
            {
                if (instanciaConexion.ObtenerConexion().State != ConnectionState.Closed)
                {
                    instanciaConexion.CerrarConexion();
                }
            }
            return Int32.Parse(ParametroNumeroSolicitud.Value.ToString());
        }

        public List<SolicitudDeFraccionamientoTO> ListarConFiltro(int pNumeroSolicitud, DateTime pFechaIni, DateTime pFechaFin, int pCodPersona, int pCodEstadoSolicitud)
        {
            List<SolicitudDeFraccionamientoTO> listaSolicitud = new List<SolicitudDeFraccionamientoTO>();
            SqlDataReader reader = null;
            SqlCommand comando;
            ConexionBD instanciaConexion = ConexionBD.ObtenerInstancia();

            try
            {

                instanciaConexion.AbrirConexion();
                comando = new SqlCommand("sp_get_SEC_SolicitudDeFraccionamiento_filter", instanciaConexion.ObtenerConexion());
                comando.Parameters.AddWithValue("@pNumeroSolicitud", pNumeroSolicitud);

                if (pFechaIni != DateTime.MinValue)
                    comando.Parameters.AddWithValue("@pFechaIni", pFechaIni);
                else
                    comando.Parameters.AddWithValue("@pFechaIni", DBNull.Value);

                if (pFechaFin != DateTime.MinValue)
                    comando.Parameters.AddWithValue("@pFechaFin", pFechaFin);
                else
                    comando.Parameters.AddWithValue("@pFechaFin", DBNull.Value);

                comando.Parameters.AddWithValue("@pCodPersona", pCodPersona);
                comando.Parameters.AddWithValue("@pCodEstadoSolicitud", pCodEstadoSolicitud);

                comando.CommandType = CommandType.StoredProcedure;

                reader = comando.ExecuteReader();
                while (reader.Read())
                {
                    SolicitudDeFraccionamientoTO solicitudTO = new SolicitudDeFraccionamientoTO();

                    solicitudTO.NumeroSolicitud = reader.GetInt32(reader.GetOrdinal("numeroSolicitud"));
                    solicitudTO.FechaSolicitud = reader.GetDateTime(reader.GetOrdinal("fechaSolicitud"));
                    solicitudTO.NumeroCuotas = reader.GetInt32(reader.GetOrdinal("numeroCuotas"));
                    solicitudTO.TasaFraccionamiento = reader.GetDecimal(reader.GetOrdinal("tasaFraccionamiento"));
                    solicitudTO.MontoFraccionamiento = reader.GetDecimal(reader.GetOrdinal("montoFraccionamiento"));
                    solicitudTO.CodEstadoSolicitud = reader.GetInt32(reader.GetOrdinal("codEstadoSolicitud"));
                    solicitudTO.CodPersona = reader.GetInt32(reader.GetOrdinal("codPersona"));
                    solicitudTO.DesPersona = reader.GetString(reader.GetOrdinal("desPersona"));
                    solicitudTO.DesEstadoSolicitud = reader.GetString(reader.GetOrdinal("desEstadoSolicitud"));

                    listaSolicitud.Add(solicitudTO);
                }

                reader.Close();
                instanciaConexion.CerrarConexion();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                listaSolicitud = null;

            }
            finally
            {
                if (reader != null)
                {
                    if (reader.IsClosed == false)
                        reader.Close();
                }
                if (instanciaConexion.ObtenerConexion().State != ConnectionState.Closed)
                {
                    instanciaConexion.CerrarConexion();
                }
            }

            return listaSolicitud;

        }

        public void ActualizarEstado(int pNumeroSolicitud, int pCodEstadoSolicitud)
        {
            SqlCommand comando;
            ConexionBD instanciaConexion = ConexionBD.ObtenerInstancia();

            try
            {
                instanciaConexion.AbrirConexion();
                comando = new SqlCommand("sp_upd_SEC_SolicitudDeFraccionamiento_estado", instanciaConexion.ObtenerConexion());
                comando.Parameters.AddWithValue("@pNumeroSolicitud", pNumeroSolicitud);
                comando.Parameters.AddWithValue("@pCodEstadoSolicitud", pCodEstadoSolicitud);

                comando.CommandType = CommandType.StoredProcedure;
                comando.ExecuteNonQuery();

                instanciaConexion.CerrarConexion();
            }
            catch (SqlException ex)
            {
                throw ex;
            }
            finally
            {
                if (instanciaConexion.ObtenerConexion().State != ConnectionState.Closed)
                {
                    instanciaConexion.CerrarConexion();
                }
            }
        }

    }
}
